#pragma once
#include <iostream>
#include <stdarg.h>
#include <time.h>

class Log
{
public:
	Log(void);
	~Log(void);
};

void InitLog();
const char * Now();

#define  LOG 0

#define LOG_TRACE(format_string,...)
#define LOG_DEBUG(format_string,...)
#define LOG_INFO(format_string,...)
#define LOG_WARNING(format_string,...)
#define LOG_ERROR(format_string,...)
#define LOG_FATAL(format_string,...)

#if LOG < 1
	#undef LOG_TRACE
	#define LOG_TRACE(format_string,...) \
	printf("%s [%ld] TRACE "format_string" [%s : %s @ %d]\n",Now(),GetCurrentThreadId(), __VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#endif

#if LOG < 2
	#undef LOG_DEBUG
	#define LOG_DEBUG(format_string,...) \
	printf("%s [%ld] DEBUG "format_string" [%s : %s @ %d]\n",Now(),GetCurrentThreadId(), __VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#endif

#if LOG < 3
	#undef LOG_INFO
	#define LOG_INFO(format_string,...) \
	printf("%s [%ld] INFO "format_string" [%s : %s @ %d]\n",Now(),GetCurrentThreadId(), __VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#endif

#if LOG < 4
	#undef LOG_WARNING
	#define LOG_WARNING(format_string,...) \
	printf("%s [%ld] WARN "format_string" [%s : %s @ %d]\n",Now(),GetCurrentThreadId(), __VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#endif

#if LOG < 6
	#undef LOG_ERROR
	#define LOG_ERROR(format_string,...) \
	printf("%s [%ld] ERROR "format_string" [%s : %s @ %d]\n",Now(),GetCurrentThreadId(), __VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#endif

#if LOG < 7
	#undef LOG_FATAL
	#define LOG_FATAL(format_string,...) \
	printf("%s [%ld] FATAL "format_string" [%s : %s @ %d]\n",Now(),GetCurrentThreadId(), __VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#endif